/*
 * Copyright (C) 2023  即时通讯网(52im.net) & Jack Jiang.
 * The MobileIMSDK v6.4 Project. 
 * All rights reserved.
 * 
 * > Github地址：https://github.com/JackJiang2011/MobileIMSDK
 * > 文档地址：  http://www.52im.net/forum-89-1.html
 * > 技术社区：  http://www.52im.net/
 * > 技术交流群：320837163 (http://www.52im.net/topic-qqgroup.html)
 * > 作者公众号：“【即时通讯技术圈】”，欢迎关注！
 * > 联系作者：  http://www.52im.net/thread-2792-1-1.html
 *  
 * "即时通讯网(52im.net) - 即时通讯开发者社区!" 推荐开源工程。
 * 
 * ServerToolKits.java at 2023-9-21 15:24:55, code by Jack Jiang.
 */
package com.zhike.mobileimsdk.server.utils;

import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;

import java.net.SocketAddress;

import com.zhike.mobileimsdk.server.network.GatewayTCP;
import com.zhike.mobileimsdk.server.network.GatewayUDP;
import com.zhike.mobileimsdk.server.network.GatewayWebsocket;
import com.zhike.mobileimsdk.server.processor.OnlineProcessor;
import com.zhike.mobileimsdk.server.protocal.CharsetHelper;
import com.zhike.mobileimsdk.server.protocal.Protocal;
import com.zhike.mobileimsdk.server.protocal.ProtocalFactory;

public class ServerToolKits {
	public static void setSenseModeTCP(SenseModeTCP mode) {
		int expire = 0;
		switch (mode) {
			case MODE_3S:
				expire = 3 * 2 + 1;
				break;
			case MODE_5S:
				expire = 5 * 2 + 1;
				break;
			case MODE_10S:
				expire = 10 * 1 + 5;
				break;
			case MODE_15S:
				expire = 15 * 1 + 5;
				break;
			case MODE_30S:
				expire = 30 * 1 + 5;
				break;
			case MODE_60S:
				expire = 60 * 1 + 5;
				break;
			case MODE_120S:
				expire = 120 * 1 + 5;
				break;
		}

		if (expire > 0)
			GatewayTCP.SESION_RECYCLER_EXPIRE = expire;
	}

	public static void setSenseModeUDP(SenseModeUDP mode) {
		int expire = 0;
		switch (mode) {
			case MODE_3S:
				expire = 3 * 3 + 1;
				break;
			case MODE_10S:
				expire = 10 * 2 + 1;
				break;
			case MODE_30S:
				expire = 30 * 2 + 2;
				break;
			case MODE_60S:
				expire = 60 * 2 + 2;
				break;
			case MODE_120S:
				expire = 120 * 2 + 2;
				break;
		}

		if (expire > 0)
			GatewayUDP.SESION_RECYCLER_EXPIRE = expire;
	}

	public static void setSenseModeWebsocket(SenseModeWebsocket mode) {
		int expire = 0;
		switch (mode) {
			case MODE_3S:
				expire = 3 * 2 + 1;
				break;
			case MODE_5S:
				expire = 5 * 2 + 1;
				break;
			case MODE_10S:
				expire = 10 * 1 + 5;
				break;
			case MODE_15S:
				expire = 15 * 1 + 5;
				break;
			case MODE_30S:
				expire = 30 * 1 + 5;
				break;
			case MODE_60S:
				expire = 60 * 1 + 5;
				break;
			case MODE_120S:
				expire = 120 * 1 + 5;
				break;
		}

		if (expire > 0)
			GatewayWebsocket.SESION_RECYCLER_EXPIRE = expire;
	}

	public static String clientInfoToString(Channel session) {
		SocketAddress remoteAddress = session.remoteAddress();
		String s1 = remoteAddress.toString();
		StringBuilder sb = new StringBuilder()
				.append("{uid:")
				.append(OnlineProcessor.getUserIdFromChannel(session))
				.append("}")
				.append(s1);
		return sb.toString();
	}

	public static String fromIOBuffer_JSON(ByteBuf buffer) throws Exception {
		byte[] req = new byte[buffer.readableBytes()];
		buffer.readBytes(req);
		String jsonStr = new String(req, CharsetHelper.DECODE_CHARSET);
		return jsonStr;
	}

	public static Protocal fromIOBuffer(ByteBuf buffer) throws Exception {
		return toProtocal(fromIOBuffer_JSON(buffer));
	}

	public static Protocal toProtocal(String protocalJSONStr) throws Exception {
		return ProtocalFactory.parse(protocalJSONStr, Protocal.class);
	}

	/**
	 * MobileIMSDK核心框架的TCP协议心跳频率模式.
	 * <p>
	 * 对于服务端而言，此模式决定了用户在非正常退出、心跳丢包、网络故障等情况下
	 * 被判定为已下线的超时时长，原则上超敏感客户端的体验越好。
	 * <p>
	 * <b>重要说明：</b><u>服务端本模式的设定必须要与客户端的模式设制保持一致</u>，否则
	 * 可能因参数的不一致而导至IM算法的不匹配，进而出现不可预知的问题。
	 * 
	 * @author Jack Jiang
	 * @version 5.0
	 */
	public enum SenseModeTCP {
		/**
		 * 对应于客户端的3秒心跳模式：此模式的用户非正常掉线超时时长为“3 * 2 + 1”秒
		 * （即：<b>非正常连接超时时间为2个心跳包间隔+1秒容忍时间</b>）。
		 * <p>
		 * 此模式为当前所有预设模式中体验最好，但客户端可能会大幅提升耗电量和心跳包的总流量。
		 */
		MODE_3S,

		/**
		 * 对应于客户端的5秒心跳模式：此模式的用户非正常掉线超时时长为“5 * 2 + 1”秒
		 * （即：<b>非正常连接超时时间为2个心跳包间隔+1秒容忍时间</b>）。
		 * <p>
		 * 此模式为当前所有预设模式中体验稍好，但客户端可能会较多提升耗电量和心跳包的总流量。
		 */
		MODE_5S,

		/**
		 * 对应于客户端的10秒心跳模式：此模式的用户非正常掉线超时时长为“10 * 1 + 5”秒
		 * （即：非正常连接超时时间为 1个心跳包间隔+5秒容忍时间）。
		 */
		MODE_10S,

		/**
		 * 对应于客户端的15秒心跳模式：此模式的用户非正常掉线超时时长为“15 * 1 + 5”秒
		 * （即：非正常连接超时时间为 1个心跳包间隔+5秒容忍时间）。
		 */
		MODE_15S,

		/**
		 * 对应于客户端的30秒心跳模式：此模式的用户非正常掉线超时时长为“30 * 1 + 5”秒
		 * （即：非正常连接超时时间为 1个心跳包间隔+5秒容忍时间）。
		 */
		MODE_30S,

		/**
		 * 对应于客户端的60秒心跳模式：此模式的用户非正常掉线超时时长为“60 * 1 + 5”秒
		 * （即：非正常连接超时时间为 1个心跳包间隔+5秒容忍时间）。
		 */
		MODE_60S,

		/**
		 * 对应于客户端的120秒心跳模式：此模式的用户非正常掉线超时时长为“120 * 1 + 5”秒
		 * （即：非正常连接超时时间为 1个心跳包间隔+5秒容忍时间）。
		 */
		MODE_120S
	}

	/**
	 * MobileIMSDK核心框架的UDP协议心跳频率模式.
	 * <p>
	 * 对于服务端而言，此模式决定了用户在非正常退出、心跳丢包、网络故障等情况下
	 * 被判定为已下线的超时时长，原则上超敏感客户端的体验越好。
	 * <p>
	 * <b>重要说明：</b><u>服务端本模式的设定必须要与客户端的模式设制保持一致</u>，否则
	 * 可能因参数的不一致而导至IM算法的不匹配，进而出现不可预知的问题。
	 * 
	 * @author Jack Jiang
	 * @version 2.1
	 */
	public enum SenseModeUDP {
		/**
		 * 对应于客户端的3秒心跳模式：此模式的用户非正常掉线超时时长为“3 * 3 + 1”秒。
		 * <p>
		 * 客户端心跳丢包容忍度为3个包。此模式为当前所有预设模式中体验最好，但
		 * 客户端可能会大幅提升耗电量和心跳包的总流量。
		 */
		MODE_3S,

		/**
		 * 对应于客户端的10秒心跳模式：此模式的用户非正常掉线超时时长为“10 * 2 + 1”秒。
		 * <p>
		 * 客户端心跳丢包容忍度为2个包。
		 */
		MODE_10S,

		/**
		 * 对应于客户端的30秒心跳模式：此模式的用户非正常掉线超时时长为“30 * 2 + 2”秒。
		 * <p>
		 * 客户端心跳丢包容忍度为2个包。
		 */
		MODE_30S,

		/**
		 * 对应于客户端的60秒心跳模式：此模式的用户非正常掉线超时时长为“60 * 2 + 2”秒。
		 * <p>
		 * 客户端心跳丢包容忍度为2个包。
		 */
		MODE_60S,

		/**
		 * 对应于客户端的120秒心跳模式：此模式的用户非正常掉线超时时长为“120 * 2 + 2”秒。
		 * <p>
		 * 客户端心跳丢包容忍度为2个包。
		 */
		MODE_120S
	}

	/**
	 * MobileIMSDK核心框架的WebSocket协议心跳频率模式.
	 * <p>
	 * 对于服务端而言，此模式决定了用户在非正常退出、心跳丢包、网络故障等情况下
	 * 被判定为已下线的超时时长，原则上超敏感客户端的体验越好。
	 * <p>
	 * <b>重要说明：</b><u>服务端本模式的设定必须要与客户端的模式设制保持一致</u>，否则
	 * 可能因参数的不一致而导至IM算法的不匹配，进而出现不可预知的问题。
	 * 
	 * @author Jack Jiang
	 * @version 6.0
	 */
	public enum SenseModeWebsocket {
		/**
		 * 对应于客户端的3秒心跳模式：此模式的用户非正常掉线超时时长为“3 * 2 + 1”秒
		 * （即：<b>非正常连接超时时间为2个心跳包间隔+1秒链路延迟容忍时间</b>）。
		 * <p>
		 * 此模式为当前所有预设模式中体验最好，但客户端可能会大幅提升耗电量和心跳包的总流量。
		 */
		MODE_3S,

		MODE_5S,

		/**
		 * 对应于客户端的10秒心跳模式：此模式的用户非正常掉线超时时长为“10 * 1 + 5”秒
		 * （即：非正常连接超时时间为 1个心跳包间隔+5秒链路延迟容忍时间）。
		 */
		MODE_10S,

		/**
		 * 对应于客户端的15秒心跳模式：此模式的用户非正常掉线超时时长为“15 * 1 + 5”秒
		 * （即：非正常连接超时时间为 1个心跳包间隔+5秒链路延迟容忍时间）。
		 */
		MODE_15S,

		/**
		 * 对应于客户端的30秒心跳模式：此模式的用户非正常掉线超时时长为“30 * 1 + 5”秒
		 * （即：非正常连接超时时间为 1个心跳包间隔+5秒链路延迟容忍时间）。
		 */
		MODE_30S,

		/**
		 * 对应于客户端的60秒心跳模式：此模式的用户非正常掉线超时时长为“60 * 1 + 5”秒
		 * （即：非正常连接超时时间为 1个心跳包间隔+5秒链路延迟容忍时间）。
		 */
		MODE_60S,

		/**
		 * 对应于客户端的120秒心跳模式：此模式的用户非正常掉线超时时长为“120 * 1 + 5”秒
		 * （即：非正常连接超时时间为 1个心跳包间隔+5秒链路延迟容忍时间）。
		 */
		MODE_120S
	}
}
